<?php
// +----------------------------------------------------------------------
// | Author: wyd 2025/11/3
// | DESC: 
// +----------------------------------------------------------------------

declare (strict_types=1);


use Swoole\Runtime;
use function Swoole\Coroutine\run;

// ！！！关键步骤：启用协程运行时
// 这行代码之后，原生的阻塞函数就会被 Hook
//Runtime::enableCoroutine();
//
//echo "开始测试协程化运行时\n";
//
//$start = microtime(true);
//
//go(function () {
//    // 这个 sleep 是协程版的，不会阻塞进程
//    co::sleep(2);
//    echo "协程 A 完成\n";
//});
//
//go(function () {
//    // 这个也是协程版的
//    co::sleep(1);
//    echo "协程 B 完成\n";
//});
//
//Swoole\Event::wait();
//
//$end = microtime(true);
//echo "总耗时: " . ($end - $start) . " 秒\n";
//启用协程 用时2秒，不适用协程是3秒

/****************************************************************************************************************/
class PdoPool
{
    public function db()
    {
        $dsn =  'mysql:host=192.168.30.201;dbname=test';
        return new \PDO($dsn,'wyd','123456');
    }
}

\Swoole\Runtime::enableCoroutine();
go(function () {
    $db = new PdoPool();
    $pdo = $db->db();
    $pdo->query('SELECT SLEEP(1)');
    echo "查询完成\n";
});
go(function () {
    echo "协程2开始\n";
    \Swoole\Coroutine::sleep(0.1);
    echo "协程2结束\n";
});
\Swoole\Event::wait();
/**
 * 未使用 Runtime::enableCoroutine() 时，同步阻塞
 * 查询完成
 * 协程2开始
 * 协程2结束
 *
 * 使用 Runtime::enableCoroutine() 时，异步阻塞
 * 协程2开始
 * 协程2结束
 * 查询完成
 */

//这里如果不设置 \Swoole\Runtime::enableCoroutine();  第一个协程调用的pdo还是阻塞的，虽然go创建了协程，但pdo实例化，并为使用协程，
//所以最佳方法是在入口文件中  使用\Swoole\Runtime::enableCoroutine()，开启协程化！！！